﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using itau.im.entidade;
using itau.im.dado;
using EnterpriseLibraryWrapper;
using itau.im.negocio;

namespace itau.im.negocio
{
    public class RelatorioCurvaBS : IRelatorioCurvaBS
    {
        public FiltroRelatorioCurva ObterFiltrosRelatorioCurva()
        {
            ICurvaDAO curvaDAO = DaoFactory.getCurvaDAO();
            IMesaDB mesaDAO = DaoFactory.getMesaDAO();

            try
            {
                //IRelatorioCurvaDAO relatorioCurvaDAO = DaoFactory.getRelatorioCurva();
                FiltroRelatorioCurva filtro = new FiltroRelatorioCurva();

                filtro.Curva = curvaDAO.ObterCurvas();
                filtro.Modalidade = curvaDAO.ObterModalidadesCurva();
                filtro.SubMesasOperacao = mesaDAO.ObterSubMesas(1);
                filtro.TipoCurva = curvaDAO.ObterTiposCurva();

                return filtro;
            }
            catch (DadosException ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosNegocios");
            }
            catch (NegociosException ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosNegocios");
            }
            catch (Exception ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosNegocios");
            }

            return null;
        }

        public List<RelatorioDadosCurvaSaida> ConsultarRelatorioDadosCurva(RelatorioDadosCurvaEntrada FiltroCurva)
        {
            List<RelatorioDadosCurvaSaida> RelatorioSaida = new List<RelatorioDadosCurvaSaida>();
            IList<TaxaPontoCurva> listaVerticesInterpolacao = null;
            IList<TaxaPontoCurva> listaMetodosAntepolacao = null;
            IList<TaxaPontoCurva> listaMetodosExtrapolacao = null;
            IList<TaxaPontoCurva> listaMetodosInterpolacao = null;
            IList<Moeda> listaMoedas = null;
            IList<TipoPrazo> listaTiposPrazo = null;
            IList<TipoTaxa> listaTipoTaxa = null;
            IList<CategoriaMercado> listaIndexadores = null;
            IList<Situacao> listaSituacoes = null;
            IList<Curva> listaCurvas = null;
            IList<SubMesa> listaMesaOrigem = null;
            IList<TipoCurva> listaTipoCurva = null;
            IList<ModalidadeCurva> listaModalidade = null;
            IList<ModeloCalculo> listaModelosCalculos = null;

            try
            {
                ICurvaDAO curvaDAO = DaoFactory.getCurvaDAO();
                IMesaDB mesaDAO = DaoFactory.getMesaDAO();
                IMoedaDAO moedaDAO = DaoFactory.getMoedaDAO();

                listaVerticesInterpolacao = curvaDAO.ObterVerticesInterpolacao();
                listaMetodosAntepolacao = curvaDAO.ObterMetodosAntepolacao();
                listaMetodosExtrapolacao = curvaDAO.ObterMetodosExtrapolacao();
                listaMetodosInterpolacao = curvaDAO.ObterMetodosInterpolacao();
                listaMoedas = moedaDAO.ObterMoedas();
                listaTiposPrazo = curvaDAO.ObterTiposPrazo();
                listaTipoTaxa = curvaDAO.ObterTiposTaxa();
                listaIndexadores = curvaDAO.ObterCategoriasMercado();
                listaSituacoes = curvaDAO.ObterSituacoes();
                listaCurvas = curvaDAO.ObterCurvas();
                listaMesaOrigem = mesaDAO.ObterSubMesas(1);
                listaTipoCurva = curvaDAO.ObterTiposCurva();
                listaModalidade = curvaDAO.ObterModalidadesCurva();
                listaModelosCalculos = curvaDAO.ObterModelosCalculo();

                foreach (Curva curva in FiltroCurva.CurvasSelecionadas)
                {
                    RelatorioDadosCurvaSaida novoRelatorio = new RelatorioDadosCurvaSaida();

                    Curva curvaRelatorio = curvaDAO.ObterCurva(curva.CodigoCurva);

                    novoRelatorio.AnosExtensao = curvaRelatorio.QuantidadeAnoExtensao.ToString();
                    novoRelatorio.Calendario = curvaRelatorio.CurvaVigente.CodigoPraca == 1 ? "Brasil" : string.Empty;
                    novoRelatorio.Curva = curvaRelatorio.CodigoCurva;
                    novoRelatorio.DataInicioVigencia = curvaRelatorio.CurvaVigente.DataInicioVigencia;
                    novoRelatorio.DataFimVigencia = curvaRelatorio.CurvaVigente.DataFimVigencia;
                    novoRelatorio.DescricaoCurva = curvaRelatorio.DescricaoCurva;

                    if (curvaRelatorio.CurvaVigente.Curva != null)
                        novoRelatorio.CurvaSucedida = curvaRelatorio.CurvaVigente.Curva.NomeCurva;

                    if (curvaRelatorio.CurvaVigente.CodigoCurvaBasePMT != 0)
                        novoRelatorio.CurvaBasePMT = listaCurvas.FirstOrDefault(p => p.CodigoCurva == curvaRelatorio.CurvaVigente.CodigoCurvaBasePMT).NomeCurva;

                    novoRelatorio.NomeCurva = curvaRelatorio.NomeCurva;
                    novoRelatorio.NomeInterno = curvaRelatorio.NomeInternoCurva;

                    TipoCurva tipoCurva = listaTipoCurva.FirstOrDefault(p => p.Codigo == curvaRelatorio.CodigoTipoCurva);
                    if (tipoCurva != null)
                        novoRelatorio.TipoCurva = tipoCurva.Nome;
                    else
                        novoRelatorio.TipoCurva = string.Empty;

                    SubMesa mesaorigem = listaMesaOrigem.FirstOrDefault(p => p.CodigoSubMesa == curvaRelatorio.CodigoSubMesaOperacao);
                    if (mesaorigem != null)
                        novoRelatorio.MesaOrigem = mesaorigem.Nome;
                    else
                        novoRelatorio.MesaOrigem = string.Empty;

                    ModalidadeCurva modalidade = listaModalidade.FirstOrDefault(p => p.Codigo == curvaRelatorio.CodigoModalidadeCurva);
                    if (modalidade != null)
                        novoRelatorio.Modalidade = modalidade.Nome;
                    else
                        novoRelatorio.Modalidade = string.Empty;

                    CategoriaMercado indexador = listaIndexadores.FirstOrDefault(p => p.Codigo == curvaRelatorio.CodigoCategoriaMercado);
                    if (indexador != null)
                        novoRelatorio.Indexador = indexador.Nome;
                    else
                        novoRelatorio.Indexador = string.Empty;

                    novoRelatorio.TaxaSpread = curvaRelatorio.CodigoClassificacao == 1 ? "Taxa" : "Spread";
                    novoRelatorio.Habilitar3Curva = curvaRelatorio.IndicadorTerceiraCurva ? "Habilitado" : "Não Habilitado";

                    Situacao situacao = listaSituacoes.FirstOrDefault(p => p.Codigo == curvaRelatorio.CodigoSituacao);
                    if (situacao != null)
                        novoRelatorio.Situacao = situacao.Nome;
                    else
                        novoRelatorio.Situacao = string.Empty;

                    novoRelatorio.Liberacao = curvaRelatorio.IndicadorLiberacaoAutomatica ? "Automática" : "Manual";


                    Moeda moeda = listaMoedas.FirstOrDefault(p => p.Codigo == curvaRelatorio.CurvaVigente.CodigoMoeda);
                    if (moeda != null)
                        novoRelatorio.Moeda = moeda.Nome;
                    else
                        novoRelatorio.Moeda = string.Empty;

                    TipoTaxa tipoTaxa = listaTipoTaxa.FirstOrDefault(p => p.Codigo == curvaRelatorio.CurvaVigente.CodigoTipoTaxa);
                    if (tipoTaxa != null)
                        novoRelatorio.TipoTaxa = tipoTaxa.Nome;
                    else
                        novoRelatorio.TipoTaxa = string.Empty;

                    TipoPrazo tipoPrazo = listaTiposPrazo.FirstOrDefault(p => p.Codigo == curvaRelatorio.CurvaVigente.CodigoTipoPrazo);
                    if (tipoPrazo != null)
                        novoRelatorio.BaseVertice = tipoPrazo.Nome;
                    else
                        novoRelatorio.BaseVertice = string.Empty;

                    novoRelatorio.PrimeiroFatorIgual1 = curvaRelatorio.CurvaVigente.IndicadorPrimeiroFator1 ? "SIM" : "NÃO";

                    novoRelatorio.TipoEntrada = curvaRelatorio.CurvaVigente.CodigoTipoEntradaDado.ToString();
                    novoRelatorio.ImportacaoArquivo = curvaRelatorio.CurvaVigente.ImportacaoArquivo;
                    novoRelatorio.ComposicaoCurva = curvaRelatorio.CurvaVigente.ComposicaoCurva;
                    novoRelatorio.GradeExecucaoCurva = curvaRelatorio.GradeExecucaoCurva;

                    TaxaPontoCurvaVigente taxaAntepolacao = curvaRelatorio.CurvaVigente.lstTaxaPontoCurvaVigente.FirstOrDefault(p => p.CodigoTipoPontoCurva == 1);
                    if (taxaAntepolacao != null)
                        novoRelatorio.Antepolacao = listaMetodosAntepolacao.FirstOrDefault(p => p.CodigoTipoTaxa == taxaAntepolacao.CodigoTipoTaxa).NomeTipoTaxa;

                    TaxaPontoCurvaVigente taxaInterpolacao = curvaRelatorio.CurvaVigente.lstTaxaPontoCurvaVigente.FirstOrDefault(p => p.CodigoTipoPontoCurva == 2);
                    if (taxaInterpolacao != null)
                        novoRelatorio.Interpolacao = listaMetodosInterpolacao.FirstOrDefault(p => p.CodigoTipoTaxa == taxaInterpolacao.CodigoTipoTaxa).NomeTipoTaxa;

                    TaxaPontoCurvaVigente taxaExtrapolacao = curvaRelatorio.CurvaVigente.lstTaxaPontoCurvaVigente.FirstOrDefault(p => p.CodigoTipoPontoCurva == 3);
                    if (taxaExtrapolacao != null)
                        novoRelatorio.Extrapolacao = listaMetodosExtrapolacao.FirstOrDefault(p => p.CodigoTipoTaxa == taxaExtrapolacao.CodigoTipoTaxa).NomeTipoTaxa;

                    TaxaPontoCurvaVigente taxaVertice = curvaRelatorio.CurvaVigente.lstTaxaPontoCurvaVigente.FirstOrDefault(p => p.CodigoTipoPontoCurva == 4);
                    if (taxaVertice != null)
                        novoRelatorio.TipoVertice = listaVerticesInterpolacao.FirstOrDefault(p => p.CodigoTipoTaxa == taxaVertice.CodigoTipoTaxa).NomeTipoTaxa;

                    ModeloCalculo modeloCalculo = listaModelosCalculos.FirstOrDefault(p => p.Codigo == curvaRelatorio.CurvaVigente.CodigoModeloCalculo);
                    if (modeloCalculo != null)
                        novoRelatorio.Modelo = modeloCalculo.Nome;

                    if (curvaRelatorio.CurvaVigente.ModeloIntervaloTolerancia != null)
                        novoRelatorio.Tunelamento = curvaRelatorio.CurvaVigente.ModeloIntervaloTolerancia.nomeModeloIntervaloTolerancia;

                    RelatorioSaida.Add(novoRelatorio);
                }


                return RelatorioSaida;
            }
            catch (DadosException ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosNegocios");
            }
            catch (NegociosException ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosNegocios");
            }
            catch (Exception ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosNegocios");
            }

            return null;
        }
    }
}
